package valve_test.forms;

import valve_test.DAO.Factory;
import valve_test.drawning.graph_pane;
import valve_test.drawning.visual;
import valve_test.logic.ierarchy;
import valve_test.logic.valves;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.*;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: Shinigami
 * Date: 14.07.14
 * Time: 17:06
 * To change this template use File | Settings | File Templates.
 */
public class integrity_check {
    private JButton bt_ok;
    private JTextArea error_text_area;
    private JPanel error_panel;
    private JFrame frame;
    private List<visual> vis = null;
    private List<valves> vs = null;
    private List<ierarchy> ies = null;
    private boolean fl = true;

    public integrity_check() {
        frame = new JFrame("Графы");
        frame.getContentPane().add(error_panel);
        frame.setSize(400, 600);
        frame.setVisible(true);
        try {
            vs = Factory.getInstance().getValvesDAO().getAllValves();
            ies = Factory.getInstance().getIerarchyDAO().getAllIerarchies();
            init_visual();
            for (int i = 0; i < vis.size(); i++){
                if (vis.get(i).getMas_in() != null){
                    for (int j = 0; j < vis.get(i).getMas_in().length; j++){
                        if (vis.get(i).getMas_in()[j].equals("-1")){
                            if (fl){
                                error_text_area.append("Найдены следующие ошибки:\n");
                                fl = false;
                            }
                            error_text_area.append("-У элемента " + vis.get(i).getV_name() + " ничего не подключено ко входу №" + String.valueOf(j+1) + ";\n");
                        }
                    }
                }
                if (vis.get(i).getMas_out() != null){
                    for (int j = 0; j < vis.get(i).getMas_out().length; j++){
                        if (vis.get(i).getMas_out()[j] == -1){
                            if (fl){
                                error_text_area.append("Найдены следующие ошибки:\n");
                                fl = false;
                            }
                            error_text_area.append("-У элемента " + vis.get(i).getV_name() + " выход №" + String.valueOf(j+1) + " не подключен ни к чему;\n");
                        }
                    }
                }
            }
            if (fl){
                fl = false;
                error_text_area.append("Ошибок не найдено");
            }
        }
        catch (SQLException ex){
            //
        }

        bt_ok.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setVisible(false);
            }
        });
    }

    private void init_visual(){
        int m_i = 0, m_o = 0;
        Point p1 = new Point();
        if (vis != null)
            vis.clear();
        else vis = new ArrayList<visual>();
        for (int j = 0; j < vs.size(); j++){
            visual temp_vis = new visual();
            temp_vis.setV_id(Integer.parseInt(vs.get(j).getv_id().toString()));
            temp_vis.setV_name(vs.get(j).getv_name());
            temp_vis.setV_state(vs.get(j).getState());
            if (vs.get(j).getinput() == 0) temp_vis.setV_type(1);
            else if (vs.get(j).getoutput() == 0) temp_vis.setV_type(3);
            else temp_vis.setV_type(2);
            vis.add(temp_vis);
        }

        for (int j = 0; j < vis.size(); j++){
            if (vis.get(j).getV_type() == 1) {
                vis.get(j).setLevel(p1);
                p1.x++;
                if (p1.x == graph_pane.getEpL()){
                    p1.x = 0;
                    p1.y++;
                }
            }
        }
        p1.x = 0;
        p1.y++;
        for (int j = 0; j < vis.size(); j++){
            if (vis.get(j).getV_type() == 2){
                vis.get(j).setLevel(p1);
                p1.x++;
                if (p1.x == graph_pane.getEpL()){
                    p1.x = 0;
                    p1.y++;
                }
            }
        }
        p1.x = 0;
        p1.y++;
        for (int j = 0; j < vis.size(); j++){
            if (vis.get(j).getV_type() == 3){
                vis.get(j).setLevel(p1);
                p1.x++;
                if (p1.x == graph_pane.getEpL()){
                    p1.x = 0;
                    p1.y++;
                }
            }
        }
        for (int j = 0; j < vis.size(); j++){
            int[] temp_mas_o = new int[1];
            String[] temp_mas_i = new String[1];
            for (int k = 0; k < vs.size(); k++){
                if (vs.get(k).getv_id() == vis.get(j).getV_id()){
                    if (vs.get(k).getoutput() > 0){
                        temp_mas_o = new int[Integer.parseInt(vs.get(k).getoutput().toString())];
                        for (int q = 0; q < Integer.parseInt(vs.get(k).getoutput().toString()); q++)
                            temp_mas_o[q] = -1;
                    }
                    else {
                        temp_mas_o = null;
                        //temp_mas_o[0] = -1;
                    }
                    if (vs.get(k).getinput() > 0){
                        temp_mas_i = new String[Integer.parseInt(vs.get(k).getinput().toString())];
                        for (int q = 0; q < Integer.parseInt(vs.get(k).getinput().toString()); q++)
                            temp_mas_i[q] = "-1";
                    }
                    else {
                        temp_mas_i = null;
                        //temp_mas_i[0] = new String("-1");
                    }
                }
            }
            for (int k = 0; k < ies.size(); k++){
                if (ies.get(k).getP_id() == vis.get(j).getV_id()){
                    for (int l = 0; l < vis.size(); l++){
                        if (ies.get(k).getC_id() == vis.get(l).getV_id()) {
                            temp_mas_o[Integer.parseInt(ies.get(k).getP_o().toString())-1] = l;
                            break;
                        }
                    }
                }
                if (ies.get(k).getC_id() == vis.get(j).getV_id()) {
                    for (int l = 0; l < vis.size(); l++){
                        if (ies.get(k).getP_id() == vis.get(l).getV_id()) {
                            temp_mas_i[Integer.parseInt(ies.get(k).getC_i().toString())-1] = String.valueOf(l) + " " + String.valueOf(ies.get(k).getP_o()-1);
                            break;
                        }
                    }
                }
            }
            vis.get(j).setMas_out(temp_mas_o);
            vis.get(j).setMas_in(temp_mas_i);
        }
    }
}
